package com.design02_Structural.pattern06_proxy.proxy03;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * @ClassName UserLogProxy
 * @Description TODO
 * @Author zhangjunhao
 * @DATE 2023/9/4 20:07
 */
public class UserLogProxy implements MethodInterceptor {

    private Object target;

    public UserLogProxy(Object target) {
        this.target = target;
    }


    /**
    * 生成CGLIB动态代理类方法
     * target就是目标被代理类
    * */
    public Object getLogProxy(){
        //增强器类,用来创建动态代理类
        Enhancer en = new Enhancer();
        //设置代理类的父类字节码对象
        en.setSuperclass(target.getClass());
        //设置回调: 对于代理类上所有的方法的调用,都会调用CallBack
        // 而Callback则需要实现intercept()方法进行拦截
        en.setCallback(this);
        //创建动态代理对象并返回,就是执行完下main的之后,返回代理对象
        return en.create();



    }



    /**
     * @Author zhangjunhao
     * @Description TODO
     * @Date  2023/9/4 
     * @Param 代理对象,目标对象中的方法的Method实例,实际参数,代理对象中的方法的method实例
     * @return  java.lang.Object
     **/
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formatter = new
                SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(formatter.format(calendar.getTime()) + " " +
                "[" +method.getName() + "] 查询用户信息...]");

        Object result = methodProxy.invokeSuper(o, args);
        return result;

    }
}
